/***
 * @file Ident AbsSyn/Ident.h
 *
 *  @Author: calle
 *  @date Apr 3, 2011
 *  
 *  @brief Ident is the Identification on a expression.
 *  	
 */

#ifndef IDENT_H_
#define IDENT_H_

#include <boost/shared_ptr.hpp>
#include <Interfaces/ICloneable.h>
#include <string>
#include <AbsSyn/AbsSyn.h>

class Ident :public ICloneable {
public:


	typedef boost::shared_ptr< Ident > IdentPtr;
	/**
	 * \brief identification has a string name.
	 *
	 * @param ident string
	 */
	Ident(const std::string& ident);
	Ident(const Ident& ident);

	/**
	 * \brief destructor
	 */
	virtual ~Ident();
	/**
	 * \brief get the string representation of ident
	 *
	 * @return ident name
	 */
	const std::string& getIdentName() const;

	/**
	 * \brief implements cloneable
	 *
	 * @return
	 */
	virtual Ident* clone() const;

	/**
	 * \brief comparison operator
	 *
	 * Compares two Ident, true on success
	 *
	 *
	 * @param rhs
	 * @return true on success
	 */
	bool operator==(const Ident& rhs) const;
	/**
	 *
	 * \brief functor operator
	 *
	 * Compares two Ident's.
	 *
	 * @see operator==
	 *
	 * @param lhs
	 * @param rhs
	 * @return true on success
	 */
	bool operator()(const Ident& lhs, const Ident& rhs ) const;
	/**
	 * \brief Assignment operator
	 *
	 * assignment operator Ident a = rhs
	 *
	 * @param rhs
	 * @return copy of the ident.
	 */
	Ident operator=(const Ident& rhs) const;
private:
	std::string m_ident;
};

#endif /* IDENT_H_ */
